home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / social / twitter / objects.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  12KB  |  412 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. from util.net import linkify
  5. from util.cacheable import urlcacheopen
  6. from social.twitter.interfaces import IDisplayableTweet
  7. from util.primitives import iproperty
  8. from social.twitter.interfaces import ITwitterFetcher
  9. from util.primitives import Storage
  10. from protocols.adapters import AdaptationFailure
  11. from util.primitives import preserve_newlines
  12. import traceback
  13. import calendar
  14. import protocols
  15. import time
  16. import simplejson
  17. from interfaces import IDisplayableStatus, IDisplayableDirect, ICachingURLObj, ILinkifiedText
  18. import rfc822
  19. from logging import getLogger
  20. log = getLogger('twitter.objects')
  21.  
  22. class TwitterCacheable(protocols.AbstractBase):
  23.     protocols.advise(instancesProvide = [
  24.         ICachingURLObj])
  25.     get_cache_names = dict
  26.     
  27.     def _get_cache_names(self):
  28.         
  29.         try:
  30.             return self._cache_names
  31.         except AttributeError:
  32.             KeyError = None
  33.             self._cache_names = self.get_cache_names()
  34.  
  35.         return self._cache_names
  36.  
  37.     cache_names = property(fget = _get_cache_names, doc = 'dict of attributes to map cache URLs as')
  38.     
  39.     def _get_cache_values(self):
  40.         
  41.         try:
  42.             return self._cache_values
  43.         except AttributeError:
  44.             KeyError = None
  45.             self._cache_values = { }
  46.  
  47.         return self._cache_values
  48.  
  49.     cache_values = property(fget = _get_cache_values, doc = 'completed values')
  50.     
  51.     def do_cache(self, cache = None):
  52.         for name, location in self.cache_names.iteritems():
  53.             if cache is not None:
  54.                 
  55.                 try:
  56.                     self.cache_values[name] = cache[location]
  57.                 continue
  58.                 except KeyError:
  59.                     pass
  60.                 except:
  61.                     None<EXCEPTION MATCH>KeyError
  62.                 
  63.  
  64.             
  65.             if self.cache_values.get(name, sentinel) is sentinel:
  66.                 
  67.                 try:
  68.                     (resp, _data) = urlcacheopen(location)
  69.                 except Exception:
  70.                     self.cache_values[name] = None
  71.  
  72.                 if resp.status <= resp.status:
  73.                     pass
  74.                 elif resp.status < 300:
  75.                     self.cache_values[name] = resp.cache_path
  76.                     if cache is not None:
  77.                         cache[location] = resp.cache_path
  78.                     
  79.                 else:
  80.                     self.cache_values[name] = None
  81.             resp.status < 300
  82.         
  83.  
  84.  
  85.  
  86. class StatusMixin(object):
  87.     
  88.     def _tweet(self):
  89.         return self
  90.  
  91.     _tweet = property(_tweet)
  92.     
  93.     def get_cache_names(self):
  94.         return {
  95.             'cache_url': self._tweet.user.profile_image_url }
  96.  
  97.     
  98.     def user_screen_name(self):
  99.         return self._tweet.user.screen_name
  100.  
  101.     user_screen_name = property(user_screen_name)
  102.     
  103.     def linkified_text(self):
  104.         
  105.         try:
  106.             return self._linkified_text
  107.         except AttributeError:
  108.             import social.twitter.functions as f
  109.             pieces = f.at_someone.split(preserve_newlines(self.text))
  110.             pieces = filter(None, pieces)
  111.             pieces = [ f.namelink(linkify(piece)) for piece in pieces ]
  112.             self._linkified_text = u''.join(pieces)
  113.             return self._linkified_text
  114.         except:
  115.             []
  116.  
  117.  
  118.     linkified_text = property(linkified_text)
  119.  
  120.  
  121. class DirectMixin(object):
  122.     
  123.     def _tweet(self):
  124.         return self
  125.  
  126.     _tweet = property(_tweet)
  127.     
  128.     def get_cache_names(self):
  129.         return {
  130.             'sender_cache_url': self._tweet.sender.profile_image_url,
  131.             'recipient_cache_url': self._tweet.recipient.profile_image_url }
  132.  
  133.     
  134.     def linkified_text(self):
  135.         
  136.         try:
  137.             return self._linkified_text
  138.         except AttributeError:
  139.             self._linkified_text = linkify(preserve_newlines(self.text))
  140.             return self._linkified_text
  141.  
  142.  
  143.     linkified_text = property(linkified_text)
  144.  
  145.  
  146. class UpdateFetcherMixin(object):
  147.     
  148.     def get_updatefreq(self):
  149.         return self._updatefreq
  150.  
  151.     
  152.     def set_updatefreq(self, value):
  153.         self._updatefreq = value
  154.  
  155.     
  156.     def del_updatefreq(self):
  157.         del self._updatefreq
  158.  
  159.     updatefreq = iproperty('get_updatefreq', 'set_updatefreq', 'del_updatefreq')
  160.  
  161.  
  162. class StringTwitterFetcher(object):
  163.     protocols.advise(instancesProvide = [
  164.         ITwitterFetcher])
  165.     
  166.     def __init__(self, url):
  167.         self.url = url
  168.  
  169.     
  170.     def id(self):
  171.         return self.url
  172.  
  173.     id = property(id)
  174.     
  175.     def Fetch(self, api):
  176.         json = api._FetchUrl(self.url)
  177.         data = simplejson.loads(json)
  178.         ret = []
  179.         for d in filter(None, data):
  180.             
  181.             try:
  182.                 ret.append(IDisplayableTweet(d))
  183.             continue
  184.             except AdaptationFailure:
  185.                 log.error('there was an error adapting %r', d)
  186.                 continue
  187.             
  188.  
  189.         
  190.         return ret
  191.  
  192.  
  193.  
  194. def fetcherFromString(s):
  195.     if s.endswith('.json') or s.endswith('.xml'):
  196.         return StringTwitterFetcher(s)
  197.     else:
  198.         return None
  199.  
  200.  
  201. class TwitterStatusMsg(StatusMixin, TwitterCacheable, Storage):
  202.     protocols.advise(instancesProvide = [
  203.         IDisplayableStatus])
  204.     direct = False
  205.     
  206.     def __init__(self, *a, **k):
  207.         Storage.__init__(self, *a, **k)
  208.         if 'user' in self:
  209.             self.user = Storage(self.user)
  210.         
  211.  
  212.     
  213.     def AsDict(self):
  214.         d = dict(self)
  215.         if 'user' in d:
  216.             d['user'] = dict(d['user'])
  217.         
  218.         d.pop('twitter', None)
  219.         d.pop('_cache_names', None)
  220.         d.pop('_cache_values', None)
  221.         d.pop('_linkified_text', None)
  222.         d.pop('_kind', None)
  223.         return d
  224.  
  225.     
  226.     def shouldShow(self, icon_type):
  227.         return self.twitter.shouldShow(self, icon_type)
  228.  
  229.     
  230.     def kind(self):
  231.         
  232.         try:
  233.             return self._kind
  234.         except AttributeError:
  235.             if self.user.get('screen_name', '').lower() == self.twitter.name.lower() and self.in_reply_to_user_id:
  236.                 self._kind = 'self_reply'
  237.             elif self.user.get('screen_name', '').lower() == self.twitter.name.lower():
  238.                 self._kind = 'self_tweet'
  239.             elif self.in_reply_to_user_id and '@' + self.twitter.name.lower() in self.text.lower():
  240.                 self._kind = 'friend_reply'
  241.             else:
  242.                 self._kind = 'friend_tweet'
  243.             return self._kind
  244.  
  245.  
  246.     kind = property(kind)
  247.     
  248.     def created_at_in_seconds(self):
  249.         return calendar.timegm(rfc822.parsedate(self.created_at))
  250.  
  251.     created_at_in_seconds = property(created_at_in_seconds)
  252.     
  253.     def relative_created_at(self):
  254.         fudge = 1.5
  255.         delta = int(time.time()) - int(self.created_at_in_seconds)
  256.         if delta < 60 * fudge:
  257.             return 'about a minute ago'
  258.         elif delta < 3600 * (1 / fudge):
  259.             return 'about %d minutes ago' % (delta / 60 + 1)
  260.         elif delta < 3600 * fudge:
  261.             return 'about an hour ago'
  262.         elif delta < 86400 * (1 / fudge):
  263.             return 'about %d hours ago' % (delta / 3600 + 1)
  264.         elif delta < 86400 * fudge:
  265.             return 'about a day ago'
  266.         else:
  267.             return 'about %d days ago' % (delta / 86400 + 1)
  268.  
  269.     relative_created_at = property(relative_created_at)
  270.     
  271.     def __repr__(self):
  272.         return '<StatusMessage id: %s>' % self.id
  273.  
  274.  
  275.  
  276. class TwitterDirectMsg(DirectMixin, TwitterCacheable, Storage):
  277.     protocols.advise(instancesProvide = [
  278.         IDisplayableDirect])
  279.     direct = True
  280.     
  281.     def __init__(self, *a, **k):
  282.         Storage.__init__(self, *a, **k)
  283.         if 'sender' in self:
  284.             self.sender = Storage(self.sender)
  285.         
  286.         if 'recipient' in self:
  287.             self.recipient = Storage(self.recipient)
  288.         
  289.  
  290.     
  291.     def AsDict(self):
  292.         d = dict(self)
  293.         if 'sender' in d:
  294.             d['sender'] = dict(d['sender'])
  295.         
  296.         if 'recipient' in d:
  297.             d['recipient'] = dict(d['recipient'])
  298.         
  299.         d.pop('twitter', None)
  300.         d.pop('_cache_names', None)
  301.         d.pop('_cache_values', None)
  302.         d.pop('_linkified_text', None)
  303.         d.pop('_kind', None)
  304.         return d
  305.  
  306.     
  307.     def shouldShow(self, icon_type):
  308.         return self.twitter.shouldShow(self, icon_type)
  309.  
  310.     
  311.     def kind(self):
  312.         
  313.         try:
  314.             return self._kind
  315.         except AttributeError:
  316.             if self.sender.get('screen_name', '').lower() == self.twitter.name.lower():
  317.                 self._kind = 'direct_sent'
  318.             else:
  319.                 self._kind = 'direct_recieved'
  320.             return self._kind
  321.  
  322.  
  323.     kind = property(kind)
  324.     
  325.     def created_at_in_seconds(self):
  326.         return calendar.timegm(rfc822.parsedate(self.created_at))
  327.  
  328.     created_at_in_seconds = property(created_at_in_seconds)
  329.     
  330.     def relative_created_at(self):
  331.         fudge = 1.5
  332.         delta = int(time.time()) - int(self.created_at_in_seconds)
  333.         if delta < 60 * fudge:
  334.             return 'about a minute ago'
  335.         elif delta < 3600 * (1 / fudge):
  336.             return 'about %d minutes ago' % (delta / 60 + 1)
  337.         elif delta < 3600 * fudge:
  338.             return 'about an hour ago'
  339.         elif delta < 86400 * (1 / fudge):
  340.             return 'about %d hours ago' % (delta / 3600 + 1)
  341.         elif delta < 86400 * fudge:
  342.             return 'about a day ago'
  343.         else:
  344.             return 'about %d days ago' % (delta / 86400 + 1)
  345.  
  346.     relative_created_at = property(relative_created_at)
  347.     
  348.     def __repr__(self):
  349.         return '<DirectMessage id: %s>' % self.id
  350.  
  351.  
  352.  
  353. def validate_user(user):
  354.     int(user.id)
  355.     unicode(user.name)
  356.     unicode(user.screen_name)
  357.     str(user.profile_image_url)
  358.  
  359.  
  360. def validate_direct(tweet):
  361.     
  362.     try:
  363.         validate_user(tweet.sender)
  364.         validate_user(tweet.recipient)
  365.         unicode(tweet.sender_screen_name)
  366.         unicode(tweet.recipient_screen_name)
  367.         int(tweet.id)
  368.         unicode(tweet.text)
  369.         tweet.relative_created_at
  370.     except Exception:
  371.         traceback.print_exc()
  372.         return False
  373.  
  374.     return True
  375.  
  376.  
  377. def validate_status(tweet):
  378.     
  379.     try:
  380.         int(tweet.id)
  381.         unicode(tweet.text)
  382.         tweet.relative_created_at
  383.         
  384.         try:
  385.             bool(tweet.favorited)
  386.         except (KeyError, AttributeError):
  387.             tweet.favorited = False
  388.  
  389.         str(tweet.source)
  390.         validate_user(tweet.user)
  391.     except Exception:
  392.         traceback.print_exc()
  393.         return False
  394.  
  395.     return True
  396.  
  397.  
  398. def tweetFromDict(d):
  399.     if 'user' in d:
  400.         t = TwitterStatusMsg(d)
  401.         if validate_status(t):
  402.             return t
  403.         
  404.     elif 'sender' in d:
  405.         t = TwitterDirectMsg(d)
  406.         if validate_direct(t):
  407.             return t
  408.         
  409.     else:
  410.         return None
  411.  
  412.